package com.itheima.service.impl;

import com.github.pagehelper.PageHelper;
import com.itheima.common.constant.MessageConstant;
import com.itheima.common.entity.PageResult;
import com.itheima.common.entity.QueryPageBean;
import com.itheima.common.entity.Result;
import com.itheima.common.utils.AliOssUtil;
import com.itheima.config.AliOssProperties;
import com.itheima.mapper.SetMealCheckGroupMapper;
import com.itheima.mapper.SetMealMapper;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.Setmeal;
import com.itheima.service.SetMealService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.*;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
public class SetMealServiceImpl implements SetMealService {
    @Autowired
    private SetMealMapper setMealMapper;
    @Autowired
    private SetMealCheckGroupMapper setMealCheckGroupMapper;
    @Autowired
    private AliOssUtil aliOssUtil;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private Configuration freemarkerConfig;
    /**
     * 新增
     */
    @Override
    public void add(List<String> checkgroupIds, Setmeal setMeal) {
        //向t_setmeal表中添加数据
        setMealMapper.add(setMeal);
        //向t_setmeal_checkgroup表中添加数据
        setMealCheckGroupMapper.add(setMeal.getId(),checkgroupIds);
        // 获取图片链接
        String imageUrl = setMeal.getImg();
        if (imageUrl != null) {
            // 解析文件名
            String fileName = extractFileName(imageUrl);
            if (fileName != null) {
                // 将文件名保存到 Redis 集合中
                redisTemplate.opsForSet().add("used_images", fileName);
            }
        }
        try {
            // 获取模板
            Template template = freemarkerConfig.getTemplate("mobile_setmeal.ftl");
            //自定义文件名
            String newFileName ="mobile_setmeal_" +  UUID.randomUUID().toString() + ".html";
            // 生成HTML文件
            Writer out = new FileWriter(newFileName);
            //基于数据模型渲染模板
            List<Setmeal> setmealList = setMealMapper.findAll();
            // 将列表包装到Map中
            Map<String, Object> root = new HashMap<>();
            root.put("setmealList", setmealList); // 将列表命名为 "setmealList" 并放入Map
            template.process(root, out);
            out.close();
            log.info("新增套餐HTML文件生成成功");
        }catch (IOException | TemplateException e) {
            e.printStackTrace();
        }
    }
    /**
     * 编辑
     * @param setmeal
     * @param checkGroupIds
     * @return
     */
    @Override
    public void edit(Setmeal setmeal, List<String> checkGroupIds) {
        Integer setmealId = setmeal.getId();
        //先去更新数据
        setMealMapper.edit(setmeal);
        //判空
        if (checkGroupIds != null && checkGroupIds.size() > 0) {
            //先删除中间表数据
            setMealCheckGroupMapper.deleteById(setmealId);
            //再添加中间表数据
            setMealCheckGroupMapper.add(setmealId, checkGroupIds);
        }
        // 获取图片链接
        String imageUrl = setmeal.getImg();
        if (imageUrl != null) {
            // 解析文件名
            String fileName = extractFileName(imageUrl);
            if (fileName != null) {
                // 将文件名保存到 Redis 集合中
                redisTemplate.opsForSet().add("used_images", fileName);
            }
        }
    }
    /**
     * 根据id查询套餐
     */
    @Override
    public Setmeal findById(Integer id) {
        Setmeal setmeal = setMealMapper.findById(id);
        setmeal.setCheckGroups(setMealMapper.findCheckGroupIdsBySetmealId(id));
        if (setmeal.getCheckGroups() == null) {
            setmeal.setCheckGroups(new ArrayList<>());
        }
        for (int i = 0; i < setmeal.getCheckGroups().size(); i++) {
            CheckGroup checkGroup = setmeal.getCheckGroups().get(i);
            //给checkGroup设置checkItems
            checkGroup.setCheckItems(setMealMapper.findCheckGroupById(checkGroup.getId()));
        }
        log.info("setmeal封装完毕");
        try {
            // 获取模板
            Template template = freemarkerConfig.getTemplate("mobile_setmeal_detail.ftl");
            //自定义文件名
            String newFileName ="mobile_setmeal_detail_" + UUID.randomUUID().toString() + ".html";
            // 生成HTML文件
            Writer out = new FileWriter(newFileName);
            // 将列表包装到Map中
            Map<String, Object> root = new HashMap<>();
            root.put("setmeal", setmeal);
            template.process(root, out);
            out.close();
            log.info("根据ID查询套餐HTML文件生成成功");
        }catch (IOException | TemplateException e) {
            e.printStackTrace();
        }
        return setmeal;
    }
    /**
     * 分页查询
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //开启分页查询
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //查询当前页结果
        List<CheckItem> rows = setMealMapper.findPage();
        //查询总记录数
        Long total = setMealMapper.countAll();
        //封装返回结果
        return new PageResult(total,rows);
    }
    /**
     * 阿里云文件上传
     * @param imgFile
     * @return
     */
    @Override
    public String uploadFile(MultipartFile imgFile) {
        try {
            // 获取原始文件名
            String originalFileName = imgFile.getOriginalFilename();
            // 获取文件扩展名
            String fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));
            // 生成唯一的文件名
            String newFileName = UUID.randomUUID().toString() + fileExtension;
            // 获取文件字节数组
            byte[] bytes = imgFile.getBytes();
            // 使用AliOssUtil上传文件
            String url = aliOssUtil.upload(bytes, newFileName);
            // 提取文件名并保存到 Redis 集合中
            String fileName = extractFileName(url);
            if (fileName != null) {
                redisTemplate.opsForSet().add("uploaded_images", fileName);
            }
            return url;
        } catch (Exception e) {
            throw new RuntimeException("文件上传失败", e);
        }
    }

    /**
     * URL中提取文件名
     * @param imageUrl
     * @return
     */
    private String extractFileName(String imageUrl) {
        // 假设 imageUrl 的格式是 https://qqjndj.oss-cn-beijing.aliyuncs.com/57af5e8e-9d7b-45d8-a4eb-78aa563e4b61.jpg
        // 提取最后一个斜杠之后的部分
        int lastSlashIndex = imageUrl.lastIndexOf("/");
        if (lastSlashIndex != -1) {
            return imageUrl.substring(lastSlashIndex + 1);
        }
        return null;
    }
}
